{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Quick Start"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `LANfactory` package is a light-weight convenience package for training `likelihood approximation networks` (LANs) in torch (or keras), \n",
    "starting from supplied training data.\n",
    "\n",
    "[LANs](https://elifesciences.org/articles/65074), although more general in potential scope of applications, were conceived in the context of sequential sampling modeling\n",
    "to account for cognitive processes giving rise to *choice* and *reaction time* data in *n-alternative forced choice experiments* commonly encountered in the cognitive sciences.\n",
    "\n",
    "In this quick tutorial we will use the [`ssms`](https://github.com/AlexanderFengler/ssm_simulators) package to generate our training data using such a sequential sampling model (SSM). The use of of the `LANfactory` package is in no way bound to utilize this `ssms` package."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Install\n",
    "\n",
    "To install the `ssms` package type,\n",
    "\n",
    "`pip install git+https://github.com/AlexanderFengler/ssm_simulators`\n",
    "\n",
    "To install the `LANfactory` package type,\n",
    "\n",
    "`pip install git+https://github.com/AlexanderFengler/LANfactory`\n",
    "\n",
    "Necessary dependency should be installed automatically in the process."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Basic Tutorial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "wandb not available\n",
      "wandb not available\n"
     ]
    }
   ],
   "source": [
    "# Load necessary packages\n",
    "import ssms\n",
    "import lanfactory\n",
    "import os\n",
    "import numpy as np\n",
    "from copy import deepcopy\n",
    "import torch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Generate Training Data\n",
    "First we need to generate some training data. As mentioned above we will do so using the `ssms` python package, however without delving into a detailed explanation\n",
    "of this package. Please refer to the [basic ssms tutorial] (https://github.com/AlexanderFengler/ssm_simulators) in case you want to learn more."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# MAKE CONFIGS\n",
    "model = \"angle\"\n",
    "# Initialize the generator config (for MLP LANs)\n",
    "generator_config = deepcopy(ssms.config.data_generator_config[\"lan\"])\n",
    "# Specify generative model (one from the list of included models mentioned above)\n",
    "generator_config[\"model\"] = model\n",
    "# Specify number of parameter sets to simulate\n",
    "generator_config[\"n_parameter_sets\"] = 100\n",
    "# Specify how many samples a simulation run should entail\n",
    "generator_config[\"n_samples\"] = 1000\n",
    "# Specify folder in which to save generated data\n",
    "generator_config[\"output_folder\"] = \"data/lan_mlp/\" + model + \"/\"\n",
    "\n",
    "# Make model config dict\n",
    "model_config = ssms.config.model_config[model]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n_cpus used:  12\n",
      "checking:  data/lan_mlp/angle/\n",
      "simulation round: 1  of 10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "simulation round: 2  of 10\n",
      "simulation round: 3  of 10\n",
      "simulation round: 4  of 10\n",
      "simulation round: 5  of 10\n",
      "simulation round: 6  of 10\n",
      "simulation round: 7  of 10\n",
      "simulation round: 8  of 10\n",
      "simulation round: 9  of 10\n",
      "simulation round: 10  of 10\n",
      "Writing to file:  data/lan_mlp/angle//training_data_53621442bc7911eebbda6ae25f443f62.pickle\n"
     ]
    }
   ],
   "source": [
    "# MAKE DATA\n",
    "\n",
    "my_dataset_generator = ssms.dataset_generators.lan_mlp.data_generator(\n",
    "    generator_config=generator_config, model_config=model_config\n",
    ")\n",
    "\n",
    "training_data = my_dataset_generator.generate_data_training_uniform(save=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Dataset completed'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# training_data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Prepare for Training\n",
    "\n",
    "Next we set up dataloaders for training with pytorch. The `LANfactory` uses custom dataloaders, taking into account particularities of the expected training data.\n",
    "Specifically, we expect to receive a bunch of training data files (the present example generates only one), where each file hosts a large number of training examples. \n",
    "So we want to define a dataloader which spits out batches from data with a specific training data file, and keeps checking when to load in a new file. \n",
    "The way this is implemented here, is via the `DatasetTorch` class in `lanfactory.trainers`, which inherits from `torch.utils.data.Dataset` and prespecifies a `batch_size`. Finally this is supplied to a [`DataLoader`](https://pytorch.org/docs/stable/data.html), for which we keep the `batch_size` argument at 0.\n",
    "\n",
    "The `DatasetTorch` class is then called as an iterator via the DataLoader and takes care of batching as well as file loading internally. \n",
    "\n",
    "You may choose your own way of defining the `DataLoader` classes, downstream you are simply expected to supply one."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# MAKE DATALOADERS\n",
    "\n",
    "# List of datafiles (here only one)\n",
    "folder_ = \"data/lan_mlp/\" + model + \"/\"  # + \"/training_data_0_nbins_0_n_1000/\"\n",
    "file_list_ = [folder_ + file_ for file_ in os.listdir(folder_)]\n",
    "\n",
    "# Training dataset\n",
    "torch_training_dataset = lanfactory.trainers.DatasetTorch(\n",
    "    file_ids=file_list_,\n",
    "    batch_size=128,\n",
    "    features_key=\"lan_data\",\n",
    "    label_key=\"lan_labels\",\n",
    ")\n",
    "\n",
    "torch_training_dataloader = torch.utils.data.DataLoader(\n",
    "    torch_training_dataset,\n",
    "    shuffle=True,\n",
    "    batch_size=None,\n",
    "    num_workers=1,\n",
    "    pin_memory=True,\n",
    ")\n",
    "\n",
    "# Validation dataset\n",
    "torch_validation_dataset = lanfactory.trainers.DatasetTorch(\n",
    "    file_ids=file_list_,\n",
    "    batch_size=128,\n",
    "    features_key=\"lan_data\",\n",
    "    label_key=\"lan_labels\",\n",
    ")\n",
    "\n",
    "torch_validation_dataloader = torch.utils.data.DataLoader(\n",
    "    torch_validation_dataset,\n",
    "    shuffle=True,\n",
    "    batch_size=None,\n",
    "    num_workers=1,\n",
    "    pin_memory=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we define two configuration dictionariers,\n",
    "\n",
    "1. The `network_config` dictionary defines the architecture and properties of the network\n",
    "2. The `train_config` dictionary defines properties concerning training hyperparameters\n",
    "\n",
    "Two examples (which we take as provided by the package, but which you can adjust according to your needs) are provided below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Network config: \n",
      "{'layer_sizes': [100, 100, 1], 'activations': ['tanh', 'tanh', 'linear'], 'train_output_type': 'logprob'}\n",
      "Train config: \n",
      "{'cpu_batch_size': 128, 'gpu_batch_size': 256, 'n_epochs': 5, 'optimizer': 'adam', 'learning_rate': 0.002, 'lr_scheduler': 'reduce_on_plateau', 'lr_scheduler_params': {}, 'weight_decay': 0.0, 'loss': 'huber', 'save_history': True}\n"
     ]
    }
   ],
   "source": [
    "# SPECIFY NETWORK CONFIGS AND TRAINING CONFIGS\n",
    "\n",
    "network_config = lanfactory.config.network_configs.network_config_mlp\n",
    "\n",
    "print(\"Network config: \")\n",
    "print(network_config)\n",
    "\n",
    "train_config = lanfactory.config.network_configs.train_config_mlp\n",
    "\n",
    "print(\"Train config: \")\n",
    "print(train_config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now load a network, and save the configuration files for convenience."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tanh\n",
      "tanh\n",
      "linear\n",
      "Found folder:  data\n",
      "Moving on...\n",
      "Found folder:  data/torch_models\n",
      "Moving on...\n",
      "Found folder:  data/torch_models/angle\n",
      "Moving on...\n",
      "Saved network config\n",
      "Saved train config\n"
     ]
    }
   ],
   "source": [
    "# LOAD NETWORK\n",
    "net = lanfactory.trainers.TorchMLP(\n",
    "    network_config=deepcopy(network_config),\n",
    "    input_shape=torch_training_dataset.input_dim,\n",
    "    save_folder=\"/data/torch_models/\",\n",
    "    generative_model_id=\"angle\",\n",
    ")\n",
    "\n",
    "# SAVE CONFIGS\n",
    "lanfactory.utils.save_configs(\n",
    "    model_id=\"angle\" + \"_torch_\",\n",
    "    save_folder=\"data/torch_models/angle/\",\n",
    "    network_config=network_config,\n",
    "    train_config=train_config,\n",
    "    allow_abs_path_folder_generation=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To finally train the network we supply our network, the dataloaders and training config to the `ModelTrainerTorchMLP` class, from `lanfactory.trainers`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Torch Device:  cpu\n",
      "Found folder:  data\n",
      "Moving on...\n",
      "name 'wandb' is not defined\n",
      "wandb not available, not storing results there\n",
      "name 'wandb' is not defined\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch: 0 / 5, batch: 0 / 3905, batch_loss: 13.097329139709473\n",
      "epoch: 0 / 5, batch: 100 / 3905, batch_loss: 13.997997283935547\n",
      "epoch: 0 / 5, batch: 200 / 3905, batch_loss: 12.503166198730469\n",
      "epoch: 0 / 5, batch: 300 / 3905, batch_loss: 16.28244400024414\n",
      "epoch: 0 / 5, batch: 400 / 3905, batch_loss: 7.728526592254639\n",
      "epoch: 0 / 5, batch: 500 / 3905, batch_loss: 15.44272232055664\n",
      "epoch: 0 / 5, batch: 600 / 3905, batch_loss: 22.524991989135742\n",
      "epoch: 0 / 5, batch: 700 / 3905, batch_loss: 11.697942733764648\n",
      "epoch: 0 / 5, batch: 800 / 3905, batch_loss: 20.523168563842773\n",
      "epoch: 0 / 5, batch: 900 / 3905, batch_loss: 16.632465362548828\n",
      "epoch: 0 / 5, batch: 1000 / 3905, batch_loss: 6.366400718688965\n",
      "epoch: 0 / 5, batch: 1100 / 3905, batch_loss: 5.964241981506348\n",
      "epoch: 0 / 5, batch: 1200 / 3905, batch_loss: 15.834897994995117\n",
      "epoch: 0 / 5, batch: 1300 / 3905, batch_loss: 7.170314788818359\n",
      "epoch: 0 / 5, batch: 1400 / 3905, batch_loss: 1.77642822265625\n",
      "epoch: 0 / 5, batch: 1500 / 3905, batch_loss: 10.663885116577148\n",
      "epoch: 0 / 5, batch: 1600 / 3905, batch_loss: 10.356498718261719\n",
      "epoch: 0 / 5, batch: 1700 / 3905, batch_loss: 2.7632412910461426\n",
      "epoch: 0 / 5, batch: 1800 / 3905, batch_loss: 4.5143609046936035\n",
      "epoch: 0 / 5, batch: 1900 / 3905, batch_loss: 25.376224517822266\n",
      "epoch: 0 / 5, batch: 2000 / 3905, batch_loss: 23.456663131713867\n",
      "epoch: 0 / 5, batch: 2100 / 3905, batch_loss: 15.752592086791992\n",
      "epoch: 0 / 5, batch: 2200 / 3905, batch_loss: 7.7677154541015625\n",
      "epoch: 0 / 5, batch: 2300 / 3905, batch_loss: 7.424492835998535\n",
      "epoch: 0 / 5, batch: 2400 / 3905, batch_loss: 2.833773612976074\n",
      "epoch: 0 / 5, batch: 2500 / 3905, batch_loss: 17.513458251953125\n",
      "epoch: 0 / 5, batch: 2600 / 3905, batch_loss: 4.01393985748291\n",
      "epoch: 0 / 5, batch: 2700 / 3905, batch_loss: 5.511014461517334\n",
      "epoch: 0 / 5, batch: 2800 / 3905, batch_loss: 6.246221542358398\n",
      "epoch: 0 / 5, batch: 2900 / 3905, batch_loss: 6.103200912475586\n",
      "epoch: 0 / 5, batch: 3000 / 3905, batch_loss: 15.569293975830078\n",
      "epoch: 0 / 5, batch: 3100 / 3905, batch_loss: 25.734458923339844\n",
      "epoch: 0 / 5, batch: 3200 / 3905, batch_loss: 27.389869689941406\n",
      "epoch: 0 / 5, batch: 3300 / 3905, batch_loss: 4.326708793640137\n",
      "epoch: 0 / 5, batch: 3400 / 3905, batch_loss: 31.710582733154297\n",
      "epoch: 0 / 5, batch: 3500 / 3905, batch_loss: 2.35121488571167\n",
      "epoch: 0 / 5, batch: 3600 / 3905, batch_loss: 5.585585117340088\n",
      "epoch: 0 / 5, batch: 3700 / 3905, batch_loss: 2.94462251663208\n",
      "epoch: 0 / 5, batch: 3800 / 3905, batch_loss: 26.048940658569336\n",
      "epoch: 0 / 5, batch: 3900 / 3905, batch_loss: 19.60919761657715\n",
      "Epoch took 0 / 5,  took 10.185943841934204 seconds\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch 0 / 5, validation_loss: 12.74\n",
      "name 'wandb' is not defined\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch: 1 / 5, batch: 0 / 3905, batch_loss: 4.617319583892822\n",
      "epoch: 1 / 5, batch: 100 / 3905, batch_loss: 2.014066696166992\n",
      "epoch: 1 / 5, batch: 200 / 3905, batch_loss: 2.1642825603485107\n",
      "epoch: 1 / 5, batch: 300 / 3905, batch_loss: 13.959161758422852\n",
      "epoch: 1 / 5, batch: 400 / 3905, batch_loss: 6.6695966720581055\n",
      "epoch: 1 / 5, batch: 500 / 3905, batch_loss: 3.936671495437622\n",
      "epoch: 1 / 5, batch: 600 / 3905, batch_loss: 21.587080001831055\n",
      "epoch: 1 / 5, batch: 700 / 3905, batch_loss: 6.0694780349731445\n",
      "epoch: 1 / 5, batch: 800 / 3905, batch_loss: 8.653833389282227\n",
      "epoch: 1 / 5, batch: 900 / 3905, batch_loss: 13.615391731262207\n",
      "epoch: 1 / 5, batch: 1000 / 3905, batch_loss: 3.7584068775177\n",
      "epoch: 1 / 5, batch: 1100 / 3905, batch_loss: 4.333657264709473\n",
      "epoch: 1 / 5, batch: 1200 / 3905, batch_loss: 29.646238327026367\n",
      "epoch: 1 / 5, batch: 1300 / 3905, batch_loss: 17.111413955688477\n",
      "epoch: 1 / 5, batch: 1400 / 3905, batch_loss: 7.1968793869018555\n",
      "epoch: 1 / 5, batch: 1500 / 3905, batch_loss: 3.5159130096435547\n",
      "epoch: 1 / 5, batch: 1600 / 3905, batch_loss: 9.797721862792969\n",
      "epoch: 1 / 5, batch: 1700 / 3905, batch_loss: 8.166755676269531\n",
      "epoch: 1 / 5, batch: 1800 / 3905, batch_loss: 7.156247138977051\n",
      "epoch: 1 / 5, batch: 1900 / 3905, batch_loss: 13.188581466674805\n",
      "epoch: 1 / 5, batch: 2000 / 3905, batch_loss: 14.893301010131836\n",
      "epoch: 1 / 5, batch: 2100 / 3905, batch_loss: 13.221624374389648\n",
      "epoch: 1 / 5, batch: 2200 / 3905, batch_loss: 16.812395095825195\n",
      "epoch: 1 / 5, batch: 2300 / 3905, batch_loss: 14.15000057220459\n",
      "epoch: 1 / 5, batch: 2400 / 3905, batch_loss: 12.21928882598877\n",
      "epoch: 1 / 5, batch: 2500 / 3905, batch_loss: 4.609439373016357\n",
      "epoch: 1 / 5, batch: 2600 / 3905, batch_loss: 5.051633358001709\n",
      "epoch: 1 / 5, batch: 2700 / 3905, batch_loss: 4.1626811027526855\n",
      "epoch: 1 / 5, batch: 2800 / 3905, batch_loss: 4.30082893371582\n",
      "epoch: 1 / 5, batch: 2900 / 3905, batch_loss: 7.870026111602783\n",
      "epoch: 1 / 5, batch: 3000 / 3905, batch_loss: 16.441862106323242\n",
      "epoch: 1 / 5, batch: 3100 / 3905, batch_loss: 18.453733444213867\n",
      "epoch: 1 / 5, batch: 3200 / 3905, batch_loss: 7.293013572692871\n",
      "epoch: 1 / 5, batch: 3300 / 3905, batch_loss: 0.5603783130645752\n",
      "epoch: 1 / 5, batch: 3400 / 3905, batch_loss: 5.047025680541992\n",
      "epoch: 1 / 5, batch: 3500 / 3905, batch_loss: 26.744564056396484\n",
      "epoch: 1 / 5, batch: 3600 / 3905, batch_loss: 2.795407772064209\n",
      "epoch: 1 / 5, batch: 3700 / 3905, batch_loss: 1.1365725994110107\n",
      "epoch: 1 / 5, batch: 3800 / 3905, batch_loss: 9.321271896362305\n",
      "epoch: 1 / 5, batch: 3900 / 3905, batch_loss: 0.8927256464958191\n",
      "Epoch took 1 / 5,  took 9.559717178344727 seconds\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch 1 / 5, validation_loss: 11.05\n",
      "name 'wandb' is not defined\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch: 2 / 5, batch: 0 / 3905, batch_loss: 20.634971618652344\n",
      "epoch: 2 / 5, batch: 100 / 3905, batch_loss: 6.761051177978516\n",
      "epoch: 2 / 5, batch: 200 / 3905, batch_loss: 2.2366011142730713\n",
      "epoch: 2 / 5, batch: 300 / 3905, batch_loss: 10.04211711883545\n",
      "epoch: 2 / 5, batch: 400 / 3905, batch_loss: 3.246603488922119\n",
      "epoch: 2 / 5, batch: 500 / 3905, batch_loss: 4.520909786224365\n",
      "epoch: 2 / 5, batch: 600 / 3905, batch_loss: 4.344391822814941\n",
      "epoch: 2 / 5, batch: 700 / 3905, batch_loss: 25.15121078491211\n",
      "epoch: 2 / 5, batch: 800 / 3905, batch_loss: 22.35767364501953\n",
      "epoch: 2 / 5, batch: 900 / 3905, batch_loss: 22.594554901123047\n",
      "epoch: 2 / 5, batch: 1000 / 3905, batch_loss: 2.5244498252868652\n",
      "epoch: 2 / 5, batch: 1100 / 3905, batch_loss: 10.735236167907715\n",
      "epoch: 2 / 5, batch: 1200 / 3905, batch_loss: 7.14178991317749\n",
      "epoch: 2 / 5, batch: 1300 / 3905, batch_loss: 8.891812324523926\n",
      "epoch: 2 / 5, batch: 1400 / 3905, batch_loss: 5.208648681640625\n",
      "epoch: 2 / 5, batch: 1500 / 3905, batch_loss: 10.681106567382812\n",
      "epoch: 2 / 5, batch: 1600 / 3905, batch_loss: 2.228867292404175\n",
      "epoch: 2 / 5, batch: 1700 / 3905, batch_loss: 7.225323677062988\n",
      "epoch: 2 / 5, batch: 1800 / 3905, batch_loss: 52.87999725341797\n",
      "epoch: 2 / 5, batch: 1900 / 3905, batch_loss: 12.023985862731934\n",
      "epoch: 2 / 5, batch: 2000 / 3905, batch_loss: 7.377394676208496\n",
      "epoch: 2 / 5, batch: 2100 / 3905, batch_loss: 8.363672256469727\n",
      "epoch: 2 / 5, batch: 2200 / 3905, batch_loss: 0.6396166086196899\n",
      "epoch: 2 / 5, batch: 2300 / 3905, batch_loss: 4.390041828155518\n",
      "epoch: 2 / 5, batch: 2400 / 3905, batch_loss: 22.935691833496094\n",
      "epoch: 2 / 5, batch: 2500 / 3905, batch_loss: 2.945956230163574\n",
      "epoch: 2 / 5, batch: 2600 / 3905, batch_loss: 104.81908416748047\n",
      "epoch: 2 / 5, batch: 2700 / 3905, batch_loss: 20.675533294677734\n",
      "epoch: 2 / 5, batch: 2800 / 3905, batch_loss: 4.824549198150635\n",
      "epoch: 2 / 5, batch: 2900 / 3905, batch_loss: 2.285233497619629\n",
      "epoch: 2 / 5, batch: 3000 / 3905, batch_loss: 2.3717381954193115\n",
      "epoch: 2 / 5, batch: 3100 / 3905, batch_loss: 2.12130069732666\n",
      "epoch: 2 / 5, batch: 3200 / 3905, batch_loss: 12.131261825561523\n",
      "epoch: 2 / 5, batch: 3300 / 3905, batch_loss: 0.6814006567001343\n",
      "epoch: 2 / 5, batch: 3400 / 3905, batch_loss: 4.484214782714844\n",
      "epoch: 2 / 5, batch: 3500 / 3905, batch_loss: 1.193141222000122\n",
      "epoch: 2 / 5, batch: 3600 / 3905, batch_loss: 7.681181907653809\n",
      "epoch: 2 / 5, batch: 3700 / 3905, batch_loss: 13.662116050720215\n",
      "epoch: 2 / 5, batch: 3800 / 3905, batch_loss: 3.7432119846343994\n",
      "epoch: 2 / 5, batch: 3900 / 3905, batch_loss: 4.922099590301514\n",
      "Epoch took 2 / 5,  took 9.444900035858154 seconds\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch 2 / 5, validation_loss: 10.65\n",
      "name 'wandb' is not defined\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch: 3 / 5, batch: 0 / 3905, batch_loss: 25.669811248779297\n",
      "epoch: 3 / 5, batch: 100 / 3905, batch_loss: 1.5136151313781738\n",
      "epoch: 3 / 5, batch: 200 / 3905, batch_loss: 17.42398452758789\n",
      "epoch: 3 / 5, batch: 300 / 3905, batch_loss: 13.319125175476074\n",
      "epoch: 3 / 5, batch: 400 / 3905, batch_loss: 0.9971398115158081\n",
      "epoch: 3 / 5, batch: 500 / 3905, batch_loss: 10.930758476257324\n",
      "epoch: 3 / 5, batch: 600 / 3905, batch_loss: 2.2854013442993164\n",
      "epoch: 3 / 5, batch: 700 / 3905, batch_loss: 1.8341578245162964\n",
      "epoch: 3 / 5, batch: 800 / 3905, batch_loss: 10.333617210388184\n",
      "epoch: 3 / 5, batch: 900 / 3905, batch_loss: 3.285689115524292\n",
      "epoch: 3 / 5, batch: 1000 / 3905, batch_loss: 1.0939733982086182\n",
      "epoch: 3 / 5, batch: 1100 / 3905, batch_loss: 11.200496673583984\n",
      "epoch: 3 / 5, batch: 1200 / 3905, batch_loss: 10.124345779418945\n",
      "epoch: 3 / 5, batch: 1300 / 3905, batch_loss: 1.1052038669586182\n",
      "epoch: 3 / 5, batch: 1400 / 3905, batch_loss: 14.439309120178223\n",
      "epoch: 3 / 5, batch: 1500 / 3905, batch_loss: 4.815329074859619\n",
      "epoch: 3 / 5, batch: 1600 / 3905, batch_loss: 10.06058406829834\n",
      "epoch: 3 / 5, batch: 1700 / 3905, batch_loss: 17.734453201293945\n",
      "epoch: 3 / 5, batch: 1800 / 3905, batch_loss: 8.647951126098633\n",
      "epoch: 3 / 5, batch: 1900 / 3905, batch_loss: 9.97447395324707\n",
      "epoch: 3 / 5, batch: 2000 / 3905, batch_loss: 10.062573432922363\n",
      "epoch: 3 / 5, batch: 2100 / 3905, batch_loss: 12.824067115783691\n",
      "epoch: 3 / 5, batch: 2200 / 3905, batch_loss: 16.821319580078125\n",
      "epoch: 3 / 5, batch: 2300 / 3905, batch_loss: 2.209836006164551\n",
      "epoch: 3 / 5, batch: 2400 / 3905, batch_loss: 8.635950088500977\n",
      "epoch: 3 / 5, batch: 2500 / 3905, batch_loss: 21.245452880859375\n",
      "epoch: 3 / 5, batch: 2600 / 3905, batch_loss: 5.512489318847656\n",
      "epoch: 3 / 5, batch: 2700 / 3905, batch_loss: 4.6687726974487305\n",
      "epoch: 3 / 5, batch: 2800 / 3905, batch_loss: 6.149880886077881\n",
      "epoch: 3 / 5, batch: 2900 / 3905, batch_loss: 8.060697555541992\n",
      "epoch: 3 / 5, batch: 3000 / 3905, batch_loss: 2.4146785736083984\n",
      "epoch: 3 / 5, batch: 3100 / 3905, batch_loss: 12.818748474121094\n",
      "epoch: 3 / 5, batch: 3200 / 3905, batch_loss: 4.972709655761719\n",
      "epoch: 3 / 5, batch: 3300 / 3905, batch_loss: 7.635541915893555\n",
      "epoch: 3 / 5, batch: 3400 / 3905, batch_loss: 11.525197982788086\n",
      "epoch: 3 / 5, batch: 3500 / 3905, batch_loss: 13.472500801086426\n",
      "epoch: 3 / 5, batch: 3600 / 3905, batch_loss: 4.540909767150879\n",
      "epoch: 3 / 5, batch: 3700 / 3905, batch_loss: 4.902186393737793\n",
      "epoch: 3 / 5, batch: 3800 / 3905, batch_loss: 0.5229633450508118\n",
      "epoch: 3 / 5, batch: 3900 / 3905, batch_loss: 5.336673736572266\n",
      "Epoch took 3 / 5,  took 9.422378063201904 seconds\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch 3 / 5, validation_loss: 9.379\n",
      "name 'wandb' is not defined\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch: 4 / 5, batch: 0 / 3905, batch_loss: 9.262052536010742\n",
      "epoch: 4 / 5, batch: 100 / 3905, batch_loss: 5.220154762268066\n",
      "epoch: 4 / 5, batch: 200 / 3905, batch_loss: 22.462020874023438\n",
      "epoch: 4 / 5, batch: 300 / 3905, batch_loss: 4.646292686462402\n",
      "epoch: 4 / 5, batch: 400 / 3905, batch_loss: 6.082769393920898\n",
      "epoch: 4 / 5, batch: 500 / 3905, batch_loss: 7.073291301727295\n",
      "epoch: 4 / 5, batch: 600 / 3905, batch_loss: 4.508846759796143\n",
      "epoch: 4 / 5, batch: 700 / 3905, batch_loss: 7.4408063888549805\n",
      "epoch: 4 / 5, batch: 800 / 3905, batch_loss: 4.591597557067871\n",
      "epoch: 4 / 5, batch: 900 / 3905, batch_loss: 7.649881839752197\n",
      "epoch: 4 / 5, batch: 1000 / 3905, batch_loss: 0.8414715528488159\n",
      "epoch: 4 / 5, batch: 1100 / 3905, batch_loss: 10.895153045654297\n",
      "epoch: 4 / 5, batch: 1200 / 3905, batch_loss: 1.348294973373413\n",
      "epoch: 4 / 5, batch: 1300 / 3905, batch_loss: 15.297443389892578\n",
      "epoch: 4 / 5, batch: 1400 / 3905, batch_loss: 15.611757278442383\n",
      "epoch: 4 / 5, batch: 1500 / 3905, batch_loss: 17.373497009277344\n",
      "epoch: 4 / 5, batch: 1600 / 3905, batch_loss: 1.6282687187194824\n",
      "epoch: 4 / 5, batch: 1700 / 3905, batch_loss: 0.8677933216094971\n",
      "epoch: 4 / 5, batch: 1800 / 3905, batch_loss: 0.5330779552459717\n",
      "epoch: 4 / 5, batch: 1900 / 3905, batch_loss: 6.568912982940674\n",
      "epoch: 4 / 5, batch: 2000 / 3905, batch_loss: 4.704890727996826\n",
      "epoch: 4 / 5, batch: 2100 / 3905, batch_loss: 1.146267056465149\n",
      "epoch: 4 / 5, batch: 2200 / 3905, batch_loss: 11.803898811340332\n",
      "epoch: 4 / 5, batch: 2300 / 3905, batch_loss: 4.893973350524902\n",
      "epoch: 4 / 5, batch: 2400 / 3905, batch_loss: 14.329444885253906\n",
      "epoch: 4 / 5, batch: 2500 / 3905, batch_loss: 8.097478866577148\n",
      "epoch: 4 / 5, batch: 2600 / 3905, batch_loss: 7.889222621917725\n",
      "epoch: 4 / 5, batch: 2700 / 3905, batch_loss: 10.390517234802246\n",
      "epoch: 4 / 5, batch: 2800 / 3905, batch_loss: 3.8665695190429688\n",
      "epoch: 4 / 5, batch: 2900 / 3905, batch_loss: 3.461524724960327\n",
      "epoch: 4 / 5, batch: 3000 / 3905, batch_loss: 0.9687780141830444\n",
      "epoch: 4 / 5, batch: 3100 / 3905, batch_loss: 3.187716484069824\n",
      "epoch: 4 / 5, batch: 3200 / 3905, batch_loss: 2.0666627883911133\n",
      "epoch: 4 / 5, batch: 3300 / 3905, batch_loss: 12.314550399780273\n",
      "epoch: 4 / 5, batch: 3400 / 3905, batch_loss: 21.9631290435791\n",
      "epoch: 4 / 5, batch: 3500 / 3905, batch_loss: 3.4165523052215576\n",
      "epoch: 4 / 5, batch: 3600 / 3905, batch_loss: 6.809844017028809\n",
      "epoch: 4 / 5, batch: 3700 / 3905, batch_loss: 0.9565699100494385\n",
      "epoch: 4 / 5, batch: 3800 / 3905, batch_loss: 1.0976557731628418\n",
      "epoch: 4 / 5, batch: 3900 / 3905, batch_loss: 10.630440711975098\n",
      "Epoch took 4 / 5,  took 9.990070819854736 seconds\n",
      "wandb not available\n",
      "wandb not available\n",
      "epoch 4 / 5, validation_loss: 8.048\n",
      "name 'wandb' is not defined\n",
      "Saving training history\n",
      "Saving training history to: data//fileid_lan_runid_torch_training_history.csv\n",
      "Saving model state dict\n",
      "Saving model parameters to: data//fileid_lan_runid_train_state_dict_torch.pt\n",
      "Saving training config to: data//fileid_lan_runid_train_config.pickle\n",
      "Saving training data details to: data//fileid_lan_runid_data_details.pickle\n",
      "name 'wandb' is not defined\n",
      "Training finished successfully...\n"
     ]
    }
   ],
   "source": [
    "# TRAIN MODEL\n",
    "model_trainer = lanfactory.trainers.ModelTrainerTorchMLP(\n",
    "    model=net,\n",
    "    train_config=train_config,\n",
    "    train_dl=torch_training_dataloader,\n",
    "    valid_dl=torch_validation_dataloader,\n",
    "    allow_abs_path_folder_generation=False,\n",
    "    pin_memory=True,\n",
    "    seed=None,\n",
    ")\n",
    "\n",
    "# model_trainer.train_model(save_history=True, save_model=True, verbose=0)\n",
    "model_trainer.train_and_evaluate()\n",
    "# LOAD MODEL"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Load Model for Inference and Call"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `LANfactory` provides some convenience functions to use networks for inference after training. \n",
    "We can load a model using the `LoadTorchMLPInfer` class, which then allows us to run fast inference via either\n",
    "a direct call, which expects a `torch.tensor` as input, or the `predict_on_batch` method, which expects a `numpy.array` \n",
    "of `dtype`, `np.float32`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tanh\n",
      "tanh\n",
      "linear\n"
     ]
    }
   ],
   "source": [
    "network_path_list = os.listdir(\"data/torch_models/angle/\")\n",
    "network_file_path = [\n",
    "    \"data/torch_models/angle/\" + file_\n",
    "    for file_ in network_path_list\n",
    "    if \"state_dict\" in file_\n",
    "][0]\n",
    "\n",
    "network = lanfactory.trainers.LoadTorchMLPInfer(\n",
    "    model_file_path=network_file_path,\n",
    "    network_config=network_config,\n",
    "    input_dim=torch_training_dataset.input_dim,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "direct call out:  tensor([-66.0045])\n",
      "predict_on_batch out:  [-66.00449]\n"
     ]
    }
   ],
   "source": [
    "# Two ways to call the network\n",
    "\n",
    "# Direct call --> need tensor input\n",
    "direct_out = network(\n",
    "    torch.from_numpy(np.array([1, 1.5, 0.5, 1.0, 0.1, 0.65, 1], dtype=np.float32))\n",
    ")\n",
    "print(\"direct call out: \", direct_out)\n",
    "\n",
    "# predict_on_batch method\n",
    "predict_on_batch_out = network.predict_on_batch(\n",
    "    np.array([1, 1.5, 0.5, 1.0, 0.1, 0.65, 1], dtype=np.float32)\n",
    ")\n",
    "print(\"predict_on_batch out: \", predict_on_batch_out)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### A peek into the first passage distribution computed by the network\n",
    "\n",
    "We can compare the learned likelihood function in our `network` with simulation data from the underlying generative model.\n",
    "For this purpose we recruit the [`ssms`](https://github.com/AlexanderFengler/ssm_simulators) package again."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/var/folders/gx/s43vynx550qbypcxm83fv56dzq4hgg/T/ipykernel_25238/496638864.py:13: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"rt\"].iloc[:1000] = np.linspace(5, 0, 1000)\n",
      "/var/folders/gx/s43vynx550qbypcxm83fv56dzq4hgg/T/ipykernel_25238/496638864.py:13: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value '[5.         4.99499499 4.98998999 4.98498498 4.97997998 4.97497497\n",
      " 4.96996997 4.96496496 4.95995996 4.95495495 4.94994995 4.94494494\n",
      " 4.93993994 4.93493493 4.92992993 4.92492492 4.91991992 4.91491491\n",
      " 4.90990991 4.9049049  4.8998999  4.89489489 4.88988989 4.88488488\n",
      " 4.87987988 4.87487487 4.86986987 4.86486486 4.85985986 4.85485485\n",
      " 4.84984985 4.84484484 4.83983984 4.83483483 4.82982983 4.82482482\n",
      " 4.81981982 4.81481481 4.80980981 4.8048048  4.7997998  4.79479479\n",
      " 4.78978979 4.78478478 4.77977978 4.77477477 4.76976977 4.76476476\n",
      " 4.75975976 4.75475475 4.74974975 4.74474474 4.73973974 4.73473473\n",
      " 4.72972973 4.72472472 4.71971972 4.71471471 4.70970971 4.7047047\n",
      " 4.6996997  4.69469469 4.68968969 4.68468468 4.67967968 4.67467467\n",
      " 4.66966967 4.66466466 4.65965966 4.65465465 4.64964965 4.64464464\n",
      " 4.63963964 4.63463463 4.62962963 4.62462462 4.61961962 4.61461461\n",
      " 4.60960961 4.6046046  4.5995996  4.59459459 4.58958959 4.58458458\n",
      " 4.57957958 4.57457457 4.56956957 4.56456456 4.55955956 4.55455455\n",
      " 4.54954955 4.54454454 4.53953954 4.53453453 4.52952953 4.52452452\n",
      " 4.51951952 4.51451451 4.50950951 4.5045045  4.4994995  4.49449449\n",
      " 4.48948949 4.48448448 4.47947948 4.47447447 4.46946947 4.46446446\n",
      " 4.45945946 4.45445445 4.44944945 4.44444444 4.43943944 4.43443443\n",
      " 4.42942943 4.42442442 4.41941942 4.41441441 4.40940941 4.4044044\n",
      " 4.3993994  4.39439439 4.38938939 4.38438438 4.37937938 4.37437437\n",
      " 4.36936937 4.36436436 4.35935936 4.35435435 4.34934935 4.34434434\n",
      " 4.33933934 4.33433433 4.32932933 4.32432432 4.31931932 4.31431431\n",
      " 4.30930931 4.3043043  4.2992993  4.29429429 4.28928929 4.28428428\n",
      " 4.27927928 4.27427427 4.26926927 4.26426426 4.25925926 4.25425425\n",
      " 4.24924925 4.24424424 4.23923924 4.23423423 4.22922923 4.22422422\n",
      " 4.21921922 4.21421421 4.20920921 4.2042042  4.1991992  4.19419419\n",
      " 4.18918919 4.18418418 4.17917918 4.17417417 4.16916917 4.16416416\n",
      " 4.15915916 4.15415415 4.14914915 4.14414414 4.13913914 4.13413413\n",
      " 4.12912913 4.12412412 4.11911912 4.11411411 4.10910911 4.1041041\n",
      " 4.0990991  4.09409409 4.08908909 4.08408408 4.07907908 4.07407407\n",
      " 4.06906907 4.06406406 4.05905906 4.05405405 4.04904905 4.04404404\n",
      " 4.03903904 4.03403403 4.02902903 4.02402402 4.01901902 4.01401401\n",
      " 4.00900901 4.004004   3.998999   3.99399399 3.98898899 3.98398398\n",
      " 3.97897898 3.97397397 3.96896897 3.96396396 3.95895896 3.95395395\n",
      " 3.94894895 3.94394394 3.93893894 3.93393393 3.92892893 3.92392392\n",
      " 3.91891892 3.91391391 3.90890891 3.9039039  3.8988989  3.89389389\n",
      " 3.88888889 3.88388388 3.87887888 3.87387387 3.86886887 3.86386386\n",
      " 3.85885886 3.85385385 3.84884885 3.84384384 3.83883884 3.83383383\n",
      " 3.82882883 3.82382382 3.81881882 3.81381381 3.80880881 3.8038038\n",
      " 3.7987988  3.79379379 3.78878879 3.78378378 3.77877878 3.77377377\n",
      " 3.76876877 3.76376376 3.75875876 3.75375375 3.74874875 3.74374374\n",
      " 3.73873874 3.73373373 3.72872873 3.72372372 3.71871872 3.71371371\n",
      " 3.70870871 3.7037037  3.6986987  3.69369369 3.68868869 3.68368368\n",
      " 3.67867868 3.67367367 3.66866867 3.66366366 3.65865866 3.65365365\n",
      " 3.64864865 3.64364364 3.63863864 3.63363363 3.62862863 3.62362362\n",
      " 3.61861862 3.61361361 3.60860861 3.6036036  3.5985986  3.59359359\n",
      " 3.58858859 3.58358358 3.57857858 3.57357357 3.56856857 3.56356356\n",
      " 3.55855856 3.55355355 3.54854855 3.54354354 3.53853854 3.53353353\n",
      " 3.52852853 3.52352352 3.51851852 3.51351351 3.50850851 3.5035035\n",
      " 3.4984985  3.49349349 3.48848849 3.48348348 3.47847848 3.47347347\n",
      " 3.46846847 3.46346346 3.45845846 3.45345345 3.44844845 3.44344344\n",
      " 3.43843844 3.43343343 3.42842843 3.42342342 3.41841842 3.41341341\n",
      " 3.40840841 3.4034034  3.3983984  3.39339339 3.38838839 3.38338338\n",
      " 3.37837838 3.37337337 3.36836837 3.36336336 3.35835836 3.35335335\n",
      " 3.34834835 3.34334334 3.33833834 3.33333333 3.32832833 3.32332332\n",
      " 3.31831832 3.31331331 3.30830831 3.3033033  3.2982983  3.29329329\n",
      " 3.28828829 3.28328328 3.27827828 3.27327327 3.26826827 3.26326326\n",
      " 3.25825826 3.25325325 3.24824825 3.24324324 3.23823824 3.23323323\n",
      " 3.22822823 3.22322322 3.21821822 3.21321321 3.20820821 3.2032032\n",
      " 3.1981982  3.19319319 3.18818819 3.18318318 3.17817818 3.17317317\n",
      " 3.16816817 3.16316316 3.15815816 3.15315315 3.14814815 3.14314314\n",
      " 3.13813814 3.13313313 3.12812813 3.12312312 3.11811812 3.11311311\n",
      " 3.10810811 3.1031031  3.0980981  3.09309309 3.08808809 3.08308308\n",
      " 3.07807808 3.07307307 3.06806807 3.06306306 3.05805806 3.05305305\n",
      " 3.04804805 3.04304304 3.03803804 3.03303303 3.02802803 3.02302302\n",
      " 3.01801802 3.01301301 3.00800801 3.003003   2.997998   2.99299299\n",
      " 2.98798799 2.98298298 2.97797798 2.97297297 2.96796797 2.96296296\n",
      " 2.95795796 2.95295295 2.94794795 2.94294294 2.93793794 2.93293293\n",
      " 2.92792793 2.92292292 2.91791792 2.91291291 2.90790791 2.9029029\n",
      " 2.8978979  2.89289289 2.88788789 2.88288288 2.87787788 2.87287287\n",
      " 2.86786787 2.86286286 2.85785786 2.85285285 2.84784785 2.84284284\n",
      " 2.83783784 2.83283283 2.82782783 2.82282282 2.81781782 2.81281281\n",
      " 2.80780781 2.8028028  2.7977978  2.79279279 2.78778779 2.78278278\n",
      " 2.77777778 2.77277277 2.76776777 2.76276276 2.75775776 2.75275275\n",
      " 2.74774775 2.74274274 2.73773774 2.73273273 2.72772773 2.72272272\n",
      " 2.71771772 2.71271271 2.70770771 2.7027027  2.6976977  2.69269269\n",
      " 2.68768769 2.68268268 2.67767768 2.67267267 2.66766767 2.66266266\n",
      " 2.65765766 2.65265265 2.64764765 2.64264264 2.63763764 2.63263263\n",
      " 2.62762763 2.62262262 2.61761762 2.61261261 2.60760761 2.6026026\n",
      " 2.5975976  2.59259259 2.58758759 2.58258258 2.57757758 2.57257257\n",
      " 2.56756757 2.56256256 2.55755756 2.55255255 2.54754755 2.54254254\n",
      " 2.53753754 2.53253253 2.52752753 2.52252252 2.51751752 2.51251251\n",
      " 2.50750751 2.5025025  2.4974975  2.49249249 2.48748749 2.48248248\n",
      " 2.47747748 2.47247247 2.46746747 2.46246246 2.45745746 2.45245245\n",
      " 2.44744745 2.44244244 2.43743744 2.43243243 2.42742743 2.42242242\n",
      " 2.41741742 2.41241241 2.40740741 2.4024024  2.3973974  2.39239239\n",
      " 2.38738739 2.38238238 2.37737738 2.37237237 2.36736737 2.36236236\n",
      " 2.35735736 2.35235235 2.34734735 2.34234234 2.33733734 2.33233233\n",
      " 2.32732733 2.32232232 2.31731732 2.31231231 2.30730731 2.3023023\n",
      " 2.2972973  2.29229229 2.28728729 2.28228228 2.27727728 2.27227227\n",
      " 2.26726727 2.26226226 2.25725726 2.25225225 2.24724725 2.24224224\n",
      " 2.23723724 2.23223223 2.22722723 2.22222222 2.21721722 2.21221221\n",
      " 2.20720721 2.2022022  2.1971972  2.19219219 2.18718719 2.18218218\n",
      " 2.17717718 2.17217217 2.16716717 2.16216216 2.15715716 2.15215215\n",
      " 2.14714715 2.14214214 2.13713714 2.13213213 2.12712713 2.12212212\n",
      " 2.11711712 2.11211211 2.10710711 2.1021021  2.0970971  2.09209209\n",
      " 2.08708709 2.08208208 2.07707708 2.07207207 2.06706707 2.06206206\n",
      " 2.05705706 2.05205205 2.04704705 2.04204204 2.03703704 2.03203203\n",
      " 2.02702703 2.02202202 2.01701702 2.01201201 2.00700701 2.002002\n",
      " 1.996997   1.99199199 1.98698699 1.98198198 1.97697698 1.97197197\n",
      " 1.96696697 1.96196196 1.95695696 1.95195195 1.94694695 1.94194194\n",
      " 1.93693694 1.93193193 1.92692693 1.92192192 1.91691692 1.91191191\n",
      " 1.90690691 1.9019019  1.8968969  1.89189189 1.88688689 1.88188188\n",
      " 1.87687688 1.87187187 1.86686687 1.86186186 1.85685686 1.85185185\n",
      " 1.84684685 1.84184184 1.83683684 1.83183183 1.82682683 1.82182182\n",
      " 1.81681682 1.81181181 1.80680681 1.8018018  1.7967968  1.79179179\n",
      " 1.78678679 1.78178178 1.77677678 1.77177177 1.76676677 1.76176176\n",
      " 1.75675676 1.75175175 1.74674675 1.74174174 1.73673674 1.73173173\n",
      " 1.72672673 1.72172172 1.71671672 1.71171171 1.70670671 1.7017017\n",
      " 1.6966967  1.69169169 1.68668669 1.68168168 1.67667668 1.67167167\n",
      " 1.66666667 1.66166166 1.65665666 1.65165165 1.64664665 1.64164164\n",
      " 1.63663664 1.63163163 1.62662663 1.62162162 1.61661662 1.61161161\n",
      " 1.60660661 1.6016016  1.5965966  1.59159159 1.58658659 1.58158158\n",
      " 1.57657658 1.57157157 1.56656657 1.56156156 1.55655656 1.55155155\n",
      " 1.54654655 1.54154154 1.53653654 1.53153153 1.52652653 1.52152152\n",
      " 1.51651652 1.51151151 1.50650651 1.5015015  1.4964965  1.49149149\n",
      " 1.48648649 1.48148148 1.47647648 1.47147147 1.46646647 1.46146146\n",
      " 1.45645646 1.45145145 1.44644645 1.44144144 1.43643644 1.43143143\n",
      " 1.42642643 1.42142142 1.41641642 1.41141141 1.40640641 1.4014014\n",
      " 1.3963964  1.39139139 1.38638639 1.38138138 1.37637638 1.37137137\n",
      " 1.36636637 1.36136136 1.35635636 1.35135135 1.34634635 1.34134134\n",
      " 1.33633634 1.33133133 1.32632633 1.32132132 1.31631632 1.31131131\n",
      " 1.30630631 1.3013013  1.2962963  1.29129129 1.28628629 1.28128128\n",
      " 1.27627628 1.27127127 1.26626627 1.26126126 1.25625626 1.25125125\n",
      " 1.24624625 1.24124124 1.23623624 1.23123123 1.22622623 1.22122122\n",
      " 1.21621622 1.21121121 1.20620621 1.2012012  1.1961962  1.19119119\n",
      " 1.18618619 1.18118118 1.17617618 1.17117117 1.16616617 1.16116116\n",
      " 1.15615616 1.15115115 1.14614615 1.14114114 1.13613614 1.13113113\n",
      " 1.12612613 1.12112112 1.11611612 1.11111111 1.10610611 1.1011011\n",
      " 1.0960961  1.09109109 1.08608609 1.08108108 1.07607608 1.07107107\n",
      " 1.06606607 1.06106106 1.05605606 1.05105105 1.04604605 1.04104104\n",
      " 1.03603604 1.03103103 1.02602603 1.02102102 1.01601602 1.01101101\n",
      " 1.00600601 1.001001   0.995996   0.99099099 0.98598599 0.98098098\n",
      " 0.97597598 0.97097097 0.96596597 0.96096096 0.95595596 0.95095095\n",
      " 0.94594595 0.94094094 0.93593594 0.93093093 0.92592593 0.92092092\n",
      " 0.91591592 0.91091091 0.90590591 0.9009009  0.8958959  0.89089089\n",
      " 0.88588589 0.88088088 0.87587588 0.87087087 0.86586587 0.86086086\n",
      " 0.85585586 0.85085085 0.84584585 0.84084084 0.83583584 0.83083083\n",
      " 0.82582583 0.82082082 0.81581582 0.81081081 0.80580581 0.8008008\n",
      " 0.7957958  0.79079079 0.78578579 0.78078078 0.77577578 0.77077077\n",
      " 0.76576577 0.76076076 0.75575576 0.75075075 0.74574575 0.74074074\n",
      " 0.73573574 0.73073073 0.72572573 0.72072072 0.71571572 0.71071071\n",
      " 0.70570571 0.7007007  0.6956957  0.69069069 0.68568569 0.68068068\n",
      " 0.67567568 0.67067067 0.66566567 0.66066066 0.65565566 0.65065065\n",
      " 0.64564565 0.64064064 0.63563564 0.63063063 0.62562563 0.62062062\n",
      " 0.61561562 0.61061061 0.60560561 0.6006006  0.5955956  0.59059059\n",
      " 0.58558559 0.58058058 0.57557558 0.57057057 0.56556557 0.56056056\n",
      " 0.55555556 0.55055055 0.54554555 0.54054054 0.53553554 0.53053053\n",
      " 0.52552553 0.52052052 0.51551552 0.51051051 0.50550551 0.5005005\n",
      " 0.4954955  0.49049049 0.48548549 0.48048048 0.47547548 0.47047047\n",
      " 0.46546547 0.46046046 0.45545546 0.45045045 0.44544545 0.44044044\n",
      " 0.43543544 0.43043043 0.42542543 0.42042042 0.41541542 0.41041041\n",
      " 0.40540541 0.4004004  0.3953954  0.39039039 0.38538539 0.38038038\n",
      " 0.37537538 0.37037037 0.36536537 0.36036036 0.35535536 0.35035035\n",
      " 0.34534535 0.34034034 0.33533534 0.33033033 0.32532533 0.32032032\n",
      " 0.31531532 0.31031031 0.30530531 0.3003003  0.2952953  0.29029029\n",
      " 0.28528529 0.28028028 0.27527528 0.27027027 0.26526527 0.26026026\n",
      " 0.25525526 0.25025025 0.24524525 0.24024024 0.23523524 0.23023023\n",
      " 0.22522523 0.22022022 0.21521522 0.21021021 0.20520521 0.2002002\n",
      " 0.1951952  0.19019019 0.18518519 0.18018018 0.17517518 0.17017017\n",
      " 0.16516517 0.16016016 0.15515516 0.15015015 0.14514515 0.14014014\n",
      " 0.13513514 0.13013013 0.12512513 0.12012012 0.11511512 0.11011011\n",
      " 0.10510511 0.1001001  0.0950951  0.09009009 0.08508509 0.08008008\n",
      " 0.07507508 0.07007007 0.06506507 0.06006006 0.05505506 0.05005005\n",
      " 0.04504505 0.04004004 0.03503504 0.03003003 0.02502503 0.02002002\n",
      " 0.01501502 0.01001001 0.00500501 0.        ]' has dtype incompatible with float32, please explicitly cast to a compatible dtype first.\n",
      "  data[\"rt\"].iloc[:1000] = np.linspace(5, 0, 1000)\n",
      "/var/folders/gx/s43vynx550qbypcxm83fv56dzq4hgg/T/ipykernel_25238/496638864.py:15: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"choice\"].iloc[:1000] = -1\n",
      "/var/folders/gx/s43vynx550qbypcxm83fv56dzq4hgg/T/ipykernel_25238/496638864.py:16: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"choice\"].iloc[1000:] = 1\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "data = pd.DataFrame(\n",
    "    np.zeros((2000, 7), dtype=np.float32),\n",
    "    columns=[\"v\", \"a\", \"z\", \"t\", \"theta\", \"rt\", \"choice\"],\n",
    ")\n",
    "data[\"v\"] = 0.5\n",
    "data[\"a\"] = 0.75\n",
    "data[\"z\"] = 0.5\n",
    "data[\"t\"] = 0.2\n",
    "data[\"theta\"] = 0.1\n",
    "data[\"rt\"].iloc[:1000] = np.linspace(5, 0, 1000)\n",
    "data[\"rt\"].iloc[1000:] = np.linspace(0, 5, 1000)\n",
    "data[\"choice\"].iloc[:1000] = -1\n",
    "data[\"choice\"].iloc[1000:] = 1\n",
    "\n",
    "# Network predictions\n",
    "predict_on_batch_out = network.predict_on_batch(data.values.astype(np.float32))\n",
    "\n",
    "# Simulations\n",
    "from ssms.basic_simulators.simulator import simulator\n",
    "\n",
    "sim_out = simulator(model=\"angle\", theta=data.values[0, :-2], n_samples=2000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'likelihod')"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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rI4ePcqgQYO49957SUpKYu3atdx6660lDkfNmjWL8PBwtm7dysiRI3n44Ye5/fbb6dy5Mzt27ODGG2/k7rvvJrsCY3GnT59m6NChbNy4kS1bttCkSRP69OljW4F727ZtAHzyySccPXrUdv9CkydPZuLEibz55pv89NNP9OzZk379+vHHH3/Y7ff888/z5JNPkpiYyBVXXMGgQYNs31uPPvooOTk5rF+/np9//pnXX3/d6d0hDUuJiFdT50Yq6ujRo+Tl5XHrrbdSv359AFq0aFHi/nFxcYwZMwaA0aNH89prrxEeHs7w4cMBGDt2LO+//z4//fQTHTt2LFdNPXr0sLv/4YcfEhYWxrp167j55puJiIgAICwsjNq1a5d4nDfffJNnnnmGO+64A4DXX3+dNWvWMGnSJKZOnWrb78knn+Smm24C4KWXXqJZs2bs3buXpk2bkpyczIABA2zvyeWXX16ur6ks1LkREa+mzo1UVFxcHNdffz0tWrTg9ttvZ/r06fz9998l7t+yZUvb576+vtSqVcsuDEVFRQFw7NixcteUmprK8OHDadKkCaGhoYSEhJCZmUlycnKpj5GRkcGRI0fo0qWL3fYuXbqQlJRkt63w11SnTh27+keNGsX48ePp0qUL48aN46effirvl1VqCjci4tXUuZGK8vX1ZdWqVSxfvpyrrrqKKVOmcOWVV7J///5i969SpYrdfZPJZLfNOpfGugaTj49PkSGuc+fOXbSmoUOHkpiYyOTJk9m0aROJiYnUqlWL3NzcMn99pXGx+u+//3727dvH3Xffzc8//0y7du2YMmWKU+qwUrgREa+ms6XEEUwmE126dOGll15i586d+Pv78+WXXzrk2BEREZw+fZqsrCzbtkutQ/P9998zatQo+vTpQ7NmzQgICCDtgsWCqlSpUiTcFxYSEkLdunX5/vvvixz7qquuKtPXEB0dzUMPPcSiRYv45z//yfTp08v0/LLSnBsR8Wpa50Yq6ocffmD16tXceOONREZG8sMPP3D8+HFiY2MdMgTToUMHgoKCeO655xg1ahQ//PADM2fOvOhzmjRpwmeffUa7du3IyMjgqaeeomrVqnb7NGjQgNWrV9OlSxcCAgKoUaNGkeM89dRTjBs3jkaNGtGqVSs++eQTEhMTmTNnTqnrf/zxx+nduzdXXHEFf//9N2vWrCHWyef1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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot network predictions\n",
    "plt.plot(\n",
    "    data[\"rt\"] * data[\"choice\"],\n",
    "    np.exp(predict_on_batch_out),\n",
    "    color=\"black\",\n",
    "    label=\"network\",\n",
    ")\n",
    "\n",
    "# Plot simulations\n",
    "plt.hist(\n",
    "    sim_out[\"rts\"] * sim_out[\"choices\"],\n",
    "    bins=100,\n",
    "    histtype=\"step\",\n",
    "    label=\"simulations\",\n",
    "    color=\"blue\",\n",
    "    density=True,\n",
    ")\n",
    "plt.legend()\n",
    "plt.title(\"SSM likelihood\")\n",
    "plt.xlabel(\"rt\")\n",
    "plt.ylabel(\"likelihod\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/var/folders/gx/s43vynx550qbypcxm83fv56dzq4hgg/T/ipykernel_25238/1241343318.py:13: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"rt\"].iloc[:1000] = np.linspace(20, 0, 1000)\n",
      "/var/folders/gx/s43vynx550qbypcxm83fv56dzq4hgg/T/ipykernel_25238/1241343318.py:13: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value '[20.         19.97997998 19.95995996 19.93993994 19.91991992 19.8998999\n",
      " 19.87987988 19.85985986 19.83983984 19.81981982 19.7997998  19.77977978\n",
      " 19.75975976 19.73973974 19.71971972 19.6996997  19.67967968 19.65965966\n",
      " 19.63963964 19.61961962 19.5995996  19.57957958 19.55955956 19.53953954\n",
      " 19.51951952 19.4994995  19.47947948 19.45945946 19.43943944 19.41941942\n",
      " 19.3993994  19.37937938 19.35935936 19.33933934 19.31931932 19.2992993\n",
      " 19.27927928 19.25925926 19.23923924 19.21921922 19.1991992  19.17917918\n",
      " 19.15915916 19.13913914 19.11911912 19.0990991  19.07907908 19.05905906\n",
      " 19.03903904 19.01901902 18.998999   18.97897898 18.95895896 18.93893894\n",
      " 18.91891892 18.8988989  18.87887888 18.85885886 18.83883884 18.81881882\n",
      " 18.7987988  18.77877878 18.75875876 18.73873874 18.71871872 18.6986987\n",
      " 18.67867868 18.65865866 18.63863864 18.61861862 18.5985986  18.57857858\n",
      " 18.55855856 18.53853854 18.51851852 18.4984985  18.47847848 18.45845846\n",
      " 18.43843844 18.41841842 18.3983984  18.37837838 18.35835836 18.33833834\n",
      " 18.31831832 18.2982983  18.27827828 18.25825826 18.23823824 18.21821822\n",
      " 18.1981982  18.17817818 18.15815816 18.13813814 18.11811812 18.0980981\n",
      " 18.07807808 18.05805806 18.03803804 18.01801802 17.997998   17.97797798\n",
      " 17.95795796 17.93793794 17.91791792 17.8978979  17.87787788 17.85785786\n",
      " 17.83783784 17.81781782 17.7977978  17.77777778 17.75775776 17.73773774\n",
      " 17.71771772 17.6976977  17.67767768 17.65765766 17.63763764 17.61761762\n",
      " 17.5975976  17.57757758 17.55755756 17.53753754 17.51751752 17.4974975\n",
      " 17.47747748 17.45745746 17.43743744 17.41741742 17.3973974  17.37737738\n",
      " 17.35735736 17.33733734 17.31731732 17.2972973  17.27727728 17.25725726\n",
      " 17.23723724 17.21721722 17.1971972  17.17717718 17.15715716 17.13713714\n",
      " 17.11711712 17.0970971  17.07707708 17.05705706 17.03703704 17.01701702\n",
      " 16.996997   16.97697698 16.95695696 16.93693694 16.91691692 16.8968969\n",
      " 16.87687688 16.85685686 16.83683684 16.81681682 16.7967968  16.77677678\n",
      " 16.75675676 16.73673674 16.71671672 16.6966967  16.67667668 16.65665666\n",
      " 16.63663664 16.61661662 16.5965966  16.57657658 16.55655656 16.53653654\n",
      " 16.51651652 16.4964965  16.47647648 16.45645646 16.43643644 16.41641642\n",
      " 16.3963964  16.37637638 16.35635636 16.33633634 16.31631632 16.2962963\n",
      " 16.27627628 16.25625626 16.23623624 16.21621622 16.1961962  16.17617618\n",
      " 16.15615616 16.13613614 16.11611612 16.0960961  16.07607608 16.05605606\n",
      " 16.03603604 16.01601602 15.995996   15.97597598 15.95595596 15.93593594\n",
      " 15.91591592 15.8958959  15.87587588 15.85585586 15.83583584 15.81581582\n",
      " 15.7957958  15.77577578 15.75575576 15.73573574 15.71571572 15.6956957\n",
      " 15.67567568 15.65565566 15.63563564 15.61561562 15.5955956  15.57557558\n",
      " 15.55555556 15.53553554 15.51551552 15.4954955  15.47547548 15.45545546\n",
      " 15.43543544 15.41541542 15.3953954  15.37537538 15.35535536 15.33533534\n",
      " 15.31531532 15.2952953  15.27527528 15.25525526 15.23523524 15.21521522\n",
      " 15.1951952  15.17517518 15.15515516 15.13513514 15.11511512 15.0950951\n",
      " 15.07507508 15.05505506 15.03503504 15.01501502 14.99499499 14.97497497\n",
      " 14.95495495 14.93493493 14.91491491 14.89489489 14.87487487 14.85485485\n",
      " 14.83483483 14.81481481 14.79479479 14.77477477 14.75475475 14.73473473\n",
      " 14.71471471 14.69469469 14.67467467 14.65465465 14.63463463 14.61461461\n",
      " 14.59459459 14.57457457 14.55455455 14.53453453 14.51451451 14.49449449\n",
      " 14.47447447 14.45445445 14.43443443 14.41441441 14.39439439 14.37437437\n",
      " 14.35435435 14.33433433 14.31431431 14.29429429 14.27427427 14.25425425\n",
      " 14.23423423 14.21421421 14.19419419 14.17417417 14.15415415 14.13413413\n",
      " 14.11411411 14.09409409 14.07407407 14.05405405 14.03403403 14.01401401\n",
      " 13.99399399 13.97397397 13.95395395 13.93393393 13.91391391 13.89389389\n",
      " 13.87387387 13.85385385 13.83383383 13.81381381 13.79379379 13.77377377\n",
      " 13.75375375 13.73373373 13.71371371 13.69369369 13.67367367 13.65365365\n",
      " 13.63363363 13.61361361 13.59359359 13.57357357 13.55355355 13.53353353\n",
      " 13.51351351 13.49349349 13.47347347 13.45345345 13.43343343 13.41341341\n",
      " 13.39339339 13.37337337 13.35335335 13.33333333 13.31331331 13.29329329\n",
      " 13.27327327 13.25325325 13.23323323 13.21321321 13.19319319 13.17317317\n",
      " 13.15315315 13.13313313 13.11311311 13.09309309 13.07307307 13.05305305\n",
      " 13.03303303 13.01301301 12.99299299 12.97297297 12.95295295 12.93293293\n",
      " 12.91291291 12.89289289 12.87287287 12.85285285 12.83283283 12.81281281\n",
      " 12.79279279 12.77277277 12.75275275 12.73273273 12.71271271 12.69269269\n",
      " 12.67267267 12.65265265 12.63263263 12.61261261 12.59259259 12.57257257\n",
      " 12.55255255 12.53253253 12.51251251 12.49249249 12.47247247 12.45245245\n",
      " 12.43243243 12.41241241 12.39239239 12.37237237 12.35235235 12.33233233\n",
      " 12.31231231 12.29229229 12.27227227 12.25225225 12.23223223 12.21221221\n",
      " 12.19219219 12.17217217 12.15215215 12.13213213 12.11211211 12.09209209\n",
      " 12.07207207 12.05205205 12.03203203 12.01201201 11.99199199 11.97197197\n",
      " 11.95195195 11.93193193 11.91191191 11.89189189 11.87187187 11.85185185\n",
      " 11.83183183 11.81181181 11.79179179 11.77177177 11.75175175 11.73173173\n",
      " 11.71171171 11.69169169 11.67167167 11.65165165 11.63163163 11.61161161\n",
      " 11.59159159 11.57157157 11.55155155 11.53153153 11.51151151 11.49149149\n",
      " 11.47147147 11.45145145 11.43143143 11.41141141 11.39139139 11.37137137\n",
      " 11.35135135 11.33133133 11.31131131 11.29129129 11.27127127 11.25125125\n",
      " 11.23123123 11.21121121 11.19119119 11.17117117 11.15115115 11.13113113\n",
      " 11.11111111 11.09109109 11.07107107 11.05105105 11.03103103 11.01101101\n",
      " 10.99099099 10.97097097 10.95095095 10.93093093 10.91091091 10.89089089\n",
      " 10.87087087 10.85085085 10.83083083 10.81081081 10.79079079 10.77077077\n",
      " 10.75075075 10.73073073 10.71071071 10.69069069 10.67067067 10.65065065\n",
      " 10.63063063 10.61061061 10.59059059 10.57057057 10.55055055 10.53053053\n",
      " 10.51051051 10.49049049 10.47047047 10.45045045 10.43043043 10.41041041\n",
      " 10.39039039 10.37037037 10.35035035 10.33033033 10.31031031 10.29029029\n",
      " 10.27027027 10.25025025 10.23023023 10.21021021 10.19019019 10.17017017\n",
      " 10.15015015 10.13013013 10.11011011 10.09009009 10.07007007 10.05005005\n",
      " 10.03003003 10.01001001  9.98998999  9.96996997  9.94994995  9.92992993\n",
      "  9.90990991  9.88988989  9.86986987  9.84984985  9.82982983  9.80980981\n",
      "  9.78978979  9.76976977  9.74974975  9.72972973  9.70970971  9.68968969\n",
      "  9.66966967  9.64964965  9.62962963  9.60960961  9.58958959  9.56956957\n",
      "  9.54954955  9.52952953  9.50950951  9.48948949  9.46946947  9.44944945\n",
      "  9.42942943  9.40940941  9.38938939  9.36936937  9.34934935  9.32932933\n",
      "  9.30930931  9.28928929  9.26926927  9.24924925  9.22922923  9.20920921\n",
      "  9.18918919  9.16916917  9.14914915  9.12912913  9.10910911  9.08908909\n",
      "  9.06906907  9.04904905  9.02902903  9.00900901  8.98898899  8.96896897\n",
      "  8.94894895  8.92892893  8.90890891  8.88888889  8.86886887  8.84884885\n",
      "  8.82882883  8.80880881  8.78878879  8.76876877  8.74874875  8.72872873\n",
      "  8.70870871  8.68868869  8.66866867  8.64864865  8.62862863  8.60860861\n",
      "  8.58858859  8.56856857  8.54854855  8.52852853  8.50850851  8.48848849\n",
      "  8.46846847  8.44844845  8.42842843  8.40840841  8.38838839  8.36836837\n",
      "  8.34834835  8.32832833  8.30830831  8.28828829  8.26826827  8.24824825\n",
      "  8.22822823  8.20820821  8.18818819  8.16816817  8.14814815  8.12812813\n",
      "  8.10810811  8.08808809  8.06806807  8.04804805  8.02802803  8.00800801\n",
      "  7.98798799  7.96796797  7.94794795  7.92792793  7.90790791  7.88788789\n",
      "  7.86786787  7.84784785  7.82782783  7.80780781  7.78778779  7.76776777\n",
      "  7.74774775  7.72772773  7.70770771  7.68768769  7.66766767  7.64764765\n",
      "  7.62762763  7.60760761  7.58758759  7.56756757  7.54754755  7.52752753\n",
      "  7.50750751  7.48748749  7.46746747  7.44744745  7.42742743  7.40740741\n",
      "  7.38738739  7.36736737  7.34734735  7.32732733  7.30730731  7.28728729\n",
      "  7.26726727  7.24724725  7.22722723  7.20720721  7.18718719  7.16716717\n",
      "  7.14714715  7.12712713  7.10710711  7.08708709  7.06706707  7.04704705\n",
      "  7.02702703  7.00700701  6.98698699  6.96696697  6.94694695  6.92692693\n",
      "  6.90690691  6.88688689  6.86686687  6.84684685  6.82682683  6.80680681\n",
      "  6.78678679  6.76676677  6.74674675  6.72672673  6.70670671  6.68668669\n",
      "  6.66666667  6.64664665  6.62662663  6.60660661  6.58658659  6.56656657\n",
      "  6.54654655  6.52652653  6.50650651  6.48648649  6.46646647  6.44644645\n",
      "  6.42642643  6.40640641  6.38638639  6.36636637  6.34634635  6.32632633\n",
      "  6.30630631  6.28628629  6.26626627  6.24624625  6.22622623  6.20620621\n",
      "  6.18618619  6.16616617  6.14614615  6.12612613  6.10610611  6.08608609\n",
      "  6.06606607  6.04604605  6.02602603  6.00600601  5.98598599  5.96596597\n",
      "  5.94594595  5.92592593  5.90590591  5.88588589  5.86586587  5.84584585\n",
      "  5.82582583  5.80580581  5.78578579  5.76576577  5.74574575  5.72572573\n",
      "  5.70570571  5.68568569  5.66566567  5.64564565  5.62562563  5.60560561\n",
      "  5.58558559  5.56556557  5.54554555  5.52552553  5.50550551  5.48548549\n",
      "  5.46546547  5.44544545  5.42542543  5.40540541  5.38538539  5.36536537\n",
      "  5.34534535  5.32532533  5.30530531  5.28528529  5.26526527  5.24524525\n",
      "  5.22522523  5.20520521  5.18518519  5.16516517  5.14514515  5.12512513\n",
      "  5.10510511  5.08508509  5.06506507  5.04504505  5.02502503  5.00500501\n",
      "  4.98498498  4.96496496  4.94494494  4.92492492  4.9049049   4.88488488\n",
      "  4.86486486  4.84484484  4.82482482  4.8048048   4.78478478  4.76476476\n",
      "  4.74474474  4.72472472  4.7047047   4.68468468  4.66466466  4.64464464\n",
      "  4.62462462  4.6046046   4.58458458  4.56456456  4.54454454  4.52452452\n",
      "  4.5045045   4.48448448  4.46446446  4.44444444  4.42442442  4.4044044\n",
      "  4.38438438  4.36436436  4.34434434  4.32432432  4.3043043   4.28428428\n",
      "  4.26426426  4.24424424  4.22422422  4.2042042   4.18418418  4.16416416\n",
      "  4.14414414  4.12412412  4.1041041   4.08408408  4.06406406  4.04404404\n",
      "  4.02402402  4.004004    3.98398398  3.96396396  3.94394394  3.92392392\n",
      "  3.9039039   3.88388388  3.86386386  3.84384384  3.82382382  3.8038038\n",
      "  3.78378378  3.76376376  3.74374374  3.72372372  3.7037037   3.68368368\n",
      "  3.66366366  3.64364364  3.62362362  3.6036036   3.58358358  3.56356356\n",
      "  3.54354354  3.52352352  3.5035035   3.48348348  3.46346346  3.44344344\n",
      "  3.42342342  3.4034034   3.38338338  3.36336336  3.34334334  3.32332332\n",
      "  3.3033033   3.28328328  3.26326326  3.24324324  3.22322322  3.2032032\n",
      "  3.18318318  3.16316316  3.14314314  3.12312312  3.1031031   3.08308308\n",
      "  3.06306306  3.04304304  3.02302302  3.003003    2.98298298  2.96296296\n",
      "  2.94294294  2.92292292  2.9029029   2.88288288  2.86286286  2.84284284\n",
      "  2.82282282  2.8028028   2.78278278  2.76276276  2.74274274  2.72272272\n",
      "  2.7027027   2.68268268  2.66266266  2.64264264  2.62262262  2.6026026\n",
      "  2.58258258  2.56256256  2.54254254  2.52252252  2.5025025   2.48248248\n",
      "  2.46246246  2.44244244  2.42242242  2.4024024   2.38238238  2.36236236\n",
      "  2.34234234  2.32232232  2.3023023   2.28228228  2.26226226  2.24224224\n",
      "  2.22222222  2.2022022   2.18218218  2.16216216  2.14214214  2.12212212\n",
      "  2.1021021   2.08208208  2.06206206  2.04204204  2.02202202  2.002002\n",
      "  1.98198198  1.96196196  1.94194194  1.92192192  1.9019019   1.88188188\n",
      "  1.86186186  1.84184184  1.82182182  1.8018018   1.78178178  1.76176176\n",
      "  1.74174174  1.72172172  1.7017017   1.68168168  1.66166166  1.64164164\n",
      "  1.62162162  1.6016016   1.58158158  1.56156156  1.54154154  1.52152152\n",
      "  1.5015015   1.48148148  1.46146146  1.44144144  1.42142142  1.4014014\n",
      "  1.38138138  1.36136136  1.34134134  1.32132132  1.3013013   1.28128128\n",
      "  1.26126126  1.24124124  1.22122122  1.2012012   1.18118118  1.16116116\n",
      "  1.14114114  1.12112112  1.1011011   1.08108108  1.06106106  1.04104104\n",
      "  1.02102102  1.001001    0.98098098  0.96096096  0.94094094  0.92092092\n",
      "  0.9009009   0.88088088  0.86086086  0.84084084  0.82082082  0.8008008\n",
      "  0.78078078  0.76076076  0.74074074  0.72072072  0.7007007   0.68068068\n",
      "  0.66066066  0.64064064  0.62062062  0.6006006   0.58058058  0.56056056\n",
      "  0.54054054  0.52052052  0.5005005   0.48048048  0.46046046  0.44044044\n",
      "  0.42042042  0.4004004   0.38038038  0.36036036  0.34034034  0.32032032\n",
      "  0.3003003   0.28028028  0.26026026  0.24024024  0.22022022  0.2002002\n",
      "  0.18018018  0.16016016  0.14014014  0.12012012  0.1001001   0.08008008\n",
      "  0.06006006  0.04004004  0.02002002  0.        ]' has dtype incompatible with float32, please explicitly cast to a compatible dtype first.\n",
      "  data[\"rt\"].iloc[:1000] = np.linspace(20, 0, 1000)\n",
      "/var/folders/gx/s43vynx550qbypcxm83fv56dzq4hgg/T/ipykernel_25238/1241343318.py:15: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"choice\"].iloc[:1000] = -1\n",
      "/var/folders/gx/s43vynx550qbypcxm83fv56dzq4hgg/T/ipykernel_25238/1241343318.py:16: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"choice\"].iloc[1000:] = 1\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "data = pd.DataFrame(\n",
    "    np.zeros((2000, 7), dtype=np.float32),\n",
    "    columns=[\"v\", \"a\", \"z\", \"t\", \"theta\", \"rt\", \"choice\"],\n",
    ")\n",
    "data[\"v\"] = 0.5\n",
    "data[\"a\"] = 0.75\n",
    "data[\"z\"] = 0.5\n",
    "data[\"t\"] = 0.2\n",
    "data[\"theta\"] = 0.1\n",
    "data[\"rt\"].iloc[:1000] = np.linspace(20, 0, 1000)\n",
    "data[\"rt\"].iloc[1000:] = np.linspace(0, 20, 1000)\n",
    "data[\"choice\"].iloc[:1000] = -1\n",
    "data[\"choice\"].iloc[1000:] = 1\n",
    "\n",
    "# Network predictions\n",
    "predict_on_batch_out = network.predict_on_batch(data.values.astype(np.float32))\n",
    "\n",
    "# Simulations\n",
    "from ssms.basic_simulators.simulator import simulator\n",
    "\n",
    "sim_out = simulator(model=\"angle\", theta=data.values[0, :-2], n_samples=2000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'likelihod')"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot network predictions\n",
    "plt.plot(\n",
    "    data[\"rt\"] * data[\"choice\"],\n",
    "    predict_on_batch_out,\n",
    "    color=\"black\",\n",
    "    label=\"network\",\n",
    ")\n",
    "\n",
    "# Plot simulations\n",
    "# plt.hist(\n",
    "#     sim_out[\"rts\"] * sim_out[\"choices\"],\n",
    "#     bins=100,\n",
    "#     histtype=\"step\",\n",
    "#     label=\"simulations\",\n",
    "#     color=\"blue\",\n",
    "#     density=True,\n",
    "# )\n",
    "plt.legend()\n",
    "plt.title(\"SSM likelihood\")\n",
    "plt.xlabel(\"rt\")\n",
    "plt.ylabel(\"likelihod\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We hope this package may be helpful in case you attempt to train [LANs](https://elifesciences.org/articles/65074) for your own research."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### END"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.8.10 ('cssm')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "c2404e761a8d4e2a34f63613cf4c9a9997cd3109cabb959a7904b2035989131a"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
